#include "stdtype.h"
#include "mxsetup.h"
#include "cortexm4.h"

/// clean the .bss section

extern const mx_void_pt __bss_start;
extern const mx_void_pt __bss_end;

void clean_bss_section ()
{
    for (mx_usize_pt next = (mx_usize_pt)__bss_start; next < __bss_end; next++)
    {
        *next = 0;
    }
}

/// copy .data from FLASH to RAM

#ifdef MXSETUP_LOADREGION_IS_FLASH
extern const mx_void_pt __data_start_flash;
extern const mx_void_pt __data_end_flash;
extern const mx_void_pt __data_start;

void copy_data_section ()
{
    for (mx_usize_t i = 0; &((mx_uint32_pt)__data_start_flash)[i] < __data_end_flash; i++)
    {
        ((mx_uint32_pt)__data_start)[i] = ((mx_uint32_pt)__data_start_flash)[i];
    }
    /**
     * ISSUE: (-O O0)
     * ---- readelf -S matrix.axf
     * [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
     * [ 3] RW_IRAM1          PROGBITS        20000000 004560 000068 00  WA  0   0  8
     * [ 4] RW_IRAM1          NOBITS          20001050 0045c8 007030 00  WA  0   0  4
     * 备注：addr 是链接地址，off 是节在 elf 文件中的偏移，由于 elf 装载在 0x08000000 处，因此 RW 在磁盘上的起始地址为 0x08004560
     * 
     * 这里能看出 RW_IRAM1 的 RW 大小为 0x68，节 4 的起始 `链接地址` 为 0x20001050，这就不知道为什么了，中间存在一块间隙 (0x20001050 - 0x20000068)，
     * 问题在于 `&Image$$RW_IRAM1$$RW$$Limit` 的值不是 0x20000068 而是 20001050，这就是上面的代码使用 `&Load$$RW_IRAM1$$RW$$Limit` 来计算 RW 大小的原因。
     */
}
#endif

/// set the vector of Cortex-M4

extern const mx_void_pt __vectors;

void vector_set ()
{
    /* call the function no need care about SP, Because Bootloader will make sure it */
    CM4_SCB->VTOR = (mx_uint32_t)&__vectors;
}
